# 格式化代码快捷键 Ctrl + Alt + L
import sys
import time

if __name__ == '__main__':
    print("hello python")
    # name = "张三"
    # age = 18
    # weight = 60
    # print('姓名：{}，年龄：{}，体重：{}'.format(name, age, weight))
    # print(type(age), type(weight), type(name))
    # result = type('123456')
    # print(result)

'''
python中本身没有强制的多行注释 
可以用三个单引号或者三个双引号来注释多行代码
所以这个就是多行注释
多行注释可以换行
'''
print('-------------------')
# 整型：没有小数点的数字 可以是正数也可以是负数和0
# 当一个数很大时 可以使用下划线进行分组 方便阅读
# num = 1_000_000  # 不影响正常输出
# print(num)
# python中整数的上限值取决于执行代码计算机的内存和处理能力
# max = 9**9999 # 9的9999次方
# b=max+100;
# sys.set_int_max_str_digits(0) # 0表示不限制整数转换为字符串的最大位数
# print(max) # Exceeds the limit (4300 digits) 报错是因为整型转字符串的限制 而不是整数的上限值
# print(b)

# 浮点数的科学计数法表示
# speed_of_sound = 3.14e+2  # 3.14 * 10^2 = 314.0
# a = 3.14e9  # 3.14乘以10的9次方
# b = 3.14E8  # 3.14乘以10的8次方
# c = 3.14e-3  # 3.14乘以10的-3次方
# print(speed_of_sound)
# print(a)
# print(b)
# print(c)
#
# message = ("python是世界上最伟大的编程语言，python是世界上最伟大的编程语言，"
#            "python是世界上最伟大的编程语言")  # 单引号和双引号想要换行就需要加一个括号
#
# name = '张三'
# age = 20
# weight = 60.2
# gender = '男'

# 字符串格式化输出
# 1.直接使用加号进行拼接 写起来麻烦且代码较乱 而且智能拼接字符串
# print('姓名：'+name,'性别:'+gender+'年龄：'+age) # 报错 因为age不是字符串而是一个整型

# 写法二：占位符
# 1.这个%i和%d都是用来表示整数的占位符 一个表示int 一个是表示decimal 十进制整数
# 2.同时可以都是用%s来表示 只不过后面的数据类型会自动转换为字符串类型
# info = '姓名:%s，性别：%s,年龄：%i,体重：%f' % (name, gender, age, weight)
# info = '姓名:%s，性别：%s,年龄：%s,体重：%s' % (name, gender, age, weight)
# print(info)
#
#
# # 写法三：f-string 目前python官方最推荐的方式
# info02 = f'姓名：{name},性别:{gender},年龄：{age},体重:{weight}'
# print(info02)
#
#
# # 转义字符
# print('python中可以使用\'单引号来包裹字符串 ')
# print("python中可以使用\"双引号来包裹字符串 ")
#
# print('python中可以使用\\反斜杠来转义字符')
#
# print('python中可以使用\n \\n表示换行')

# \b 删除\b前一个字符
# time.sleep(3)
# print('正在输入:',end='',flush=True)
# time.sleep(0.5)
# print('你',end='',flush=True)
# time.sleep(0.5)
# print('好',end='',flush=True)
# time.sleep(0.5)
# print('啊',end='',flush=True)
# time.sleep(0.5)
# print('\b',end='',flush=True)
# time.sleep(0.5)
# print('呀',end='',flush=True)


# \r 表示输入时覆盖当前字符
# time.sleep(3)
# for i in range(1,101):
#     print(f"\r正在加载{i*1}%",end='',flush=True)
#     time.sleep(0.1)

#
# result  = str(18)
# number = int(15.6)
# number01 = int('79')
# number02 = int('  79   ') # 也可以正常转换为整数
# number03 = int('7  9') # 报错 因为字符串中包含空格

# print(type(result),result)
# print(type(number),number)
# print(type(number01),number01)
# print(type(number02),number02)
# print(type(number03),number03)  # 报错 因为字符串中包含空格

# print(9//3) # 取整
# price = 10
# price += price # price = price + price
# print(price)

# ord()查看字符的ASCII码值
# print(ord('a'))
# print(ord('我'))
# print(ord('A'))
#
# # python中除0以外的任何数 转换为布尔值后都为True
# print(bool(1))
# print(bool(0)) # 只有这个为 false
# print(bool(100))
# print(bool(3.14))
# print(bool(3.14e2))
#
# # 如果是字符串 除了空字符串 其他都为真
# print('--------------------')
# print(bool(''))
# print(bool('0'))
# print(bool('我'))
# print(bool('12345.21454'))

# and 逻辑运算符
# and 返回的值不一定是布尔值 他返回的是某个参与计算的值本身
# 规则：and会先看左边 如果左边为假 就直接返回左边 否则返回右边的值
# 注意：如果参与and运算的值不是布尔值 python会自动转为布尔值 然后在进行逻辑操作
# print(0 and 1+3) # 直接返回左边 不计算右边 0
# print(True and 1+3) # 右边计算 4
# print('' and 1+5) # 返回右边的空字符串
# print(True and 8/4) # 右边值为浮点数 2.0
# print(True and False) #  右边为假 返回false
# print(3*3 and 2/2) # 返回右边计算的值
#
# # or 判断两边至少有一个为True （只要有一个True 就返回True）
# print(True or True) # True
# print(True or False)  # True
# print(False or True)  # True
# print (False or False) # False
# # or 也具备逻辑短路的能力 如果左边为True 则直接返回True 不计算右边的值
# print(True or 1/0) # 正常除数不能为0 会报错 但是由于左边是True 所以直接返回了True 没有计算右边的值
# # or 返回的也不一定是布尔值 而是返回的参与计算的值本身
# # 如果参与or运算的值不是布尔值 python会自动将其转为布尔值 然后在进行逻辑操作
# print(3/3 or True) # 1.0
# print(False or 1/1)  # 1.0

# not 取反
# 如果参与not运算的值不是布尔值 python会自动将其转为布尔值 然后在进行逻辑操作
# not返回的值一定是布尔值
# print(not True)  # False
# print(not False)  # True
# print(not 0)  # True
# print(not 100)  # False
#
# # python会自动将其转换为十进制
# num = 0x1CF  # 16进制
# num02 = 0b11010  # 2进制
# num03 = 0o1034  # 8进制
# print(num)
# print(num02)
# print(num03)

# python中的进制转换
# bin() 将十进制转换为二进制的 字符串
# print(bin(10))
# # oct() 将十进制转换为八进制的 字符串
# print(oct(540))
# #hex() 将十进制转换为十六进制的 字符串
# print(hex(463))
# int() 将指定进制的数转换为十进制的数字
# print(int('0b11001',2)) # 表示你要将谁转换为十进制 这个值本身是几进制的
# print(int('0x1CF',16))
# print(int('0o1034',8))


# print("请输入你的名字：")
# name = input('请输入你的名字：')
# age = input('请输入你的年龄：')
# age = int(age) # 因为input得到的默认是字符串 如果不转换为int型 无法进行数学运算
# print(f'你的名字是:{name}，你今年{age}岁，明年{age+1}岁')


# 分支语句
# weather = input('请输入明年的天气：')
# if(weather == '晴天'):
#     print('明天出去露营')
# else:
#     print('明天不出门')
# # 与if语句同级 不收if语句的控制
# print('welcome to python world')


# 多分支语句
# age  = int(input('请输入你的年龄:'))
# if age<18:
#     print('未成年 好好努力 未来可期!')
# elif age<30:
#     print('正青春 保持活力!')
# elif age<50:
#     print('三十而立 保持健康!')
# else:
#     print('五十岁以上 保持 longevity!')


# 嵌套语句练习 
# 马拉松比赛报名审核程序
# 1.参赛年龄必须是18-45之间
# 2.参赛前必须提交体检报告 否则不能比赛
# 3.比赛结束后按会员等级 领取不同的礼物 1 T恤 2 跑鞋 3 耳机
# age = int(input('请输入你的年龄：'))
# if 18 <= age <= 45: # age >=18 and age <= 45
#     print('参赛年龄符合要求')
#     print('可以参赛')
#     report = input('请输入是否提交的体检报告:')
#     if report == '是':
#         print('提交的体检报告 可以比赛')
#         level = int(input('请输入你的会员等级：'))
#         if level == 1:
#             print(f'会员等级为{level} 可以领取T恤')
#         elif level == 2:
#             print(f'会员等级为{level} 可以领取跑鞋')
#         elif level == 3:
#             print(f'会员等级为{level} 可以领取耳机')
#         else:
#             print('会员等级输入错误！')
#     elif report == '否':
#         print('未提交体检报告 不能比赛')
#     else:
#         print('提交报告输入有误！')
# else:
#     print('参赛年龄不符合要求')


# 循环
# n = 1
# while n<=10:
#     print(n)
#     n+=1
# while循环练习
# 模拟密匙逃脱场景
# 1.用户必须正确的回答问题 才可以'逃出密室'
# 2. 如果回答错误 系统不断循环提问 直到答对为止
# 3. 如果回答正确 控制台打印逃脱成功 并结束循环

# number = 1024
# while True:
#     num = int(input('请输入程序员最喜欢的日期：'))
#     if num == number:
#         print('恭喜你回答正确 逃脱成功！ ')
#         break
#     else:
#         print('回答错误 请重新输入！')


# for 循环
# for n in range(10):  # n的值是从0-9 range[0,10) 相当于这个 包含0但是不包含10
#     print(n)
# for i in range(1,11): # i的范围是1-10
#     print(f'i的值为：{i}')
#
# for m in 'hello world': # 打印字符串中的每个字符
#     print(m)


# 因为在for中修改了迭代对象 所以导致列表一直无法遍历完 所以进入了死循环
# nums = [1,2,3]
# for i in nums:
#     # nums.append(4) # 在列表末尾添加一个元素4
#     print(i)


# for循环练习
# 设计一个字符串加密程序
# 使用ord()查看字符Unicode编码 使用chr()将Unicode编码转换为字符
# 加密代码
# text = input('请输入需要加密的字符串:')
# secret = ''
# for i in text:
#     unicode = ord(i)
#     secret += chr(unicode+1)
# print(f'加密后的字符串是:{secret}')
# #解密代码 先拿到加密后的字符串 然后得到每个字符串的uncode编码 然后减一 得到原字符串的uncode编码 然后在转换为字符串
# code = ''
# for j in secret:
#     c = ord(j)-1
#     code += chr(c)
# print(f'解密后的字符串是:{code}')


# 循环嵌套
# 1.打印一个30天的健身计划
# 2. 每一天有3组任务 然后第一天完成
# for i in range(1,31):
#     print(f'第{i}天')
#     for j in range(1,4):
#         print(f'这是第{j}组仰卧起坐')
#     print(f'第{i}天任务已完成!明天继续')
#     if i == 30:
#         print('恭喜你完成了30天的健身计划，坚持使人成功！')
# num = 1
# while num <=30:
#     print(f'第{num}天')
#     for i in range(1,4):
#         print(f'这是第{i}组俯卧撑')
#     print(f'第{num}天任务已完成！明天继续 \n')
#     if num == 30:
#         print(f'恭喜你完成了{num}天的健身计划，坚持使人成功！')
#     num += 1

# 循环打印99乘法表
# for i in range(1,10):
#     for j in range(1,i+1):
#         print(f'{j}*{i}={i*j}',end='\t')
#     print('')


# 循环综合案例：答题闯关挑战赛
# 1.一共三个关卡 一个关卡一个题 答对进行下一关 三关都通过则挑战成功
# 2. 答错可以重试 每题有三次回答机会 超过三次则挑战失败 游戏自动结束
# 3. 如果用户输入为空 则提示重新作答 且不浪费回答机会
# 4. 如果用户输入q 则游戏自动结束


# 提示词
# print('欢迎来到答题闯关挑战赛！\n')
#
# # 题目和答案
# ques1,ans1 = 'python中用于输出的函数是什么：','print'
# ques2,ans2 = 'python中用于输入的函数是什么：','input'
# ques3,ans3 = 'python中用于定义函数的关键字是什么：','def'
#
# # 最多可尝试次数
# max_try=3
# # 总的关卡数
# total_level = 3
# # 是否可以正常闯关
# can_pass = True
#
# # 根据题目数量开始循环
# for i in range(1,total_level+1):
#     # 打印当前是第几关
#     print(f'第{i}关')
#     # 每一关对应不同的题目
#     if i ==1:
#         # 第一关
#         question ,answer = ques1,ans1
#     elif i == 2:
#         question,answer = ques2,ans2
#     else:
#         question,answer = ques3,ans3
#
# # 记录当前尝试次数
#     n = 1
#     while n<=max_try:
#        # 向用户提问
#        user_input = input(question)
#        if user_input == answer:
#            print('回答正确\n')
#            break
#        elif user_input == '':
#            print('你的输入为空 请重新输入！')
#            continue
#        elif user_input == 'q':
#            print('退出游戏成功')
#            can_pass = False
#            break
#
#        else:
#            i = max_try - n
#            if i > 0:
#                print(f'回答错误，你还有{i}次机会！\n')
#                n+=1
#                continue
#            else:
#                print(f'挑战失败 本题正确答案是{answer},游戏结束')
#                can_pass = False
#                break
#     # 每次进入下一关之前 都要看一下can_pass是否为true 如果为false就要结束游戏
#     if not can_pass:
#         break
# if can_pass:
#     print('恭喜你完成了所有关卡 挑战成功！')





